import { isFunction } from "@/shared";
import type { IDictData } from "@/types/dict";
import { getDictDataInfo } from "@/utils/api/dictLabel";

interface IParams {
  dictKey: string;
}

/**
 * 获取字典信息
 * @returns
 */
export const useDictData = () => {
  /**
   * 获取字典数据并将其赋值给指定对象的属性。
   *
   * @param dictKey - 字典的键值，用于查询字典数据。
   * @param result - 目标对象，字典数据将被赋值给该对象的指定属性。
   * @param callback - 可选的回调函数，在字典数据获取成功后执行，接收字典数据作为参数。
   * @template T - 目标对象的类型，必须是一个包含字符串键的任意对象。
   */
  function getDictData<T extends IDictData[]>(dictKey: string, result: Ref<T>, callback?: (data: T) => void) {
    getDictDataInfo<T, IParams>({ dictKey })
      .then(res => {
        result.value = res.result;
        if (isFunction(callback)) {
          callback(res.result);
        }
      })
      .catch(res => {
        console.log(res);
      });
  }

  /* 获取字典值方法二，返回一个Promise对象 */
  function getDictInfoV2<T extends IDictData[]>(dictKey: string): Promise<T> {
    return new Promise((reslove, reject) => {
      getDictDataInfo<T, IParams>({ dictKey })
        .then(res => {
          if (res.status === 1) {
            reslove(res.result);
          } else {
            ElMessage.error(res.msg);
            reject([]);
          }
        })
        .catch(res => {
          console.log(res);
          ElMessage.error(res.msg);
          reject([]);
        });
    });
  }

  return { getDictData, getDictInfoV2 };
};
